home *** CD-ROM | disk | FTP | other *** search
/ Network CD 1 / Network CD.iso / others / parnfs / getopt.c < prev    next >
C/C++ Source or Header  |  1993-12-02  |  3KB  |  139 lines

  1. /* $Id: getopt.c,v 1.1 1993/12/02 20:45:46 Rhialto Exp $
  2.  * $Log: getopt.c,v $
  3.  * Revision 1.1  1993/12/02  20:45:46  Rhialto
  4.  * Initial revision
  5.  *
  6.  * Revision 1.2  1993/06/11  16:31:57  Rhialto
  7.  * First real RCS checkin
  8.  *
  9.  */
  10. /*
  11.  * getopt.h - Get next option letter from argument vector. v1.1
  12.  * 12-Dec-1987    aklevin
  13.  */
  14.  
  15. #define GETOPT_H
  16.  
  17. #include <stdio.h>
  18. #include <string.h>
  19.  
  20. /*
  21.  * optarg points to an option's argument (if any). optind holds the index
  22.  * of the next argument vector element to parse. Once all options have
  23.  * been parsed, points to the first non-option argument. [If (optind >
  24.  * argc) then there are no more arguments]. opterr, if set to 0 will
  25.  * suppress getopt's error messages (default is 1). optopt, while not
  26.  * usually documented, is used here to return the actual option character
  27.  * found, even when getopt itself returns '?'.
  28.  */
  29. char           *optarg;
  30. int        optind = 1,
  31.         opterr = 1,
  32.         optopt;
  33.  
  34. int getopt(int argc, char *argv[], char *optstring);
  35.  
  36. int
  37. getopt(argc, argv, optstring)
  38. int        argc;
  39. char           *argv[],
  40.            *optstring;
  41. {
  42.  
  43.     int         any_more,
  44.             i,
  45.             result;
  46.     static int        opthold,
  47.             optsub = 1;
  48.  
  49.     /* Reset optarg upon entry    */
  50.     optarg = NULL;
  51.  
  52.     /* Reset optsub if caller has changed optind.     */
  53.     if (optind != opthold)
  54.     optsub = 1;
  55.  
  56.     /* Look at each element of the argument vector still unparsed.  */
  57.     for (; optind < argc; optind++) {
  58.     /*
  59.      * Done if a non-option argument or single dash is reached.
  60.      * However, don't skip over said argument.
  61.      */
  62.     if (argv[optind][0] != '-' || argv[optind][1] == '\0')
  63.         break;
  64.  
  65.     /* Got an option.  */
  66.  
  67.     /* Done if "--" is reached.  Skip over it, too.  */
  68.     if (argv[optind][1] == '-') {
  69.         optind++;
  70.         break;
  71.     }
  72.     /* Look at each character in optstring.  */
  73.     for (i = 0; i < strlen(optstring); i++) {
  74.         if ((optopt = argv[optind][optsub]) != optstring[i])
  75.         continue;
  76.  
  77.         /* Got a match.  */
  78.  
  79.         /* Are there any more chars in this option?  e.g. `-abc'  */
  80.         any_more = strlen(argv[optind]) - optsub - 1;
  81.  
  82.         /* Does this option require an argument?  */
  83.         if (optstring[i + 1] == ':') {
  84.  
  85.         /* Yes.  If this is the last argument, complain.  */
  86.         if (optind == argc - 1 && !any_more) {
  87.             if (opterr)
  88.             fprintf(stderr, "%s: `-%c' option requires an argument.\n", argv[0], optopt);
  89.             optind++;
  90.             result = '?';
  91.             goto leave;
  92.         }
  93.         /* end if (opt */
  94.         /*
  95.          * Qualifier is either rest of this argument (if any) or
  96.          * next argument.
  97.          */
  98.         else {
  99.             if (!any_more)
  100.             optarg = argv[++optind];
  101.             else
  102.             optarg = &argv[optind][optsub + 1];
  103.             optind++;
  104.             optsub = 1;
  105.         }        /* end else */
  106.         }
  107.          /* end if (opt */
  108.         else {
  109.         /* No argument; just adjust indices.  */
  110.         /* Advance to next argument.  */
  111.         if (!any_more) {
  112.             optind++;
  113.             optsub = 1;
  114.         }
  115.         /* end if (! */
  116.          /* Advance to next character.     */
  117.         else
  118.             optsub++;
  119.         }            /* end else */
  120.         result = optopt;
  121.         goto leave;
  122.     }            /* end for (i=0 */
  123.     if (opterr)
  124.         fprintf(stderr, "%s: Unrecognized option `-%c'.\n", argv[0], optopt);
  125.     if (strlen(argv[optind]) - optsub - 1)
  126.         optsub++;
  127.     else {
  128.         optind++;
  129.         optsub = 1;
  130.     }
  131.     result = '?';
  132.     goto leave;
  133.     }                /* end for ( ; */
  134.     result = EOF;
  135. leave:
  136.     opthold = optind;
  137.     return (result);
  138. }                /* end getopt() */
  139.